2014-01-10 9 views
14

Ich kann Web API/JSON.NET bei der Serialisierung von Objekten nicht daran hindern, Newtonsoft.Json.PreserveReferencesHandling.Objects zu verwenden. Mit anderen Worten, $ id/$ ref immer in den serialisierten Objekten trotz der folgenden Einstellungen:

public class MvcApplication : System.Web.HttpApplication { 

    protected void Application_Start() { 
     WebApiConfig.Register(GlobalConfiguration.Configuration); 
    } 

} 

public static class WebApiConfig { 

    public static void Register (HttpConfiguration config) { 
     JsonMediaTypeFormatter jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().Single(); 
     jsonFormatter.UseDataContractJsonSerializer = false; 
     jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; 
     jsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
     jsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; 
    } 

} 

Irgendwelche Ideen?

+0

diese Einstellung in der '' WebApiConfig'' Klasse ('' public static void Register (HttpConfiguration config) '' aufgerufen von der '' geschützten void Application_Start() '' innerhalb von Global.asax.cs – Michael

+1

Gemäß @AndreHaverdings 'Antwort unten, PreserveReferencesHandling auf Alle setzt die Ids und Referenzen hinzugefügt werden. Einstellung Ihrer letzten Zeile zu 'jsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveRef escencesHandling.None; ' sollte den Trick tun. – Buzzwig

Antwort

3

Wenn die Serialisierung mit auf Ihren Objekten Attribute (wie Datacontract), von den JSON.Net documentation on Serialization Attributes:

Neben der Verwendung des eingebauten in Json.NET Attributen Json.NET sieht auch für den [SerializableAttribute] [2] (wenn IgnoreSerializableAttribute auf DefaultContractResolver auf false gesetzt ist) [DataContractAttribute] [3], [DataMemberAttribute] [4] und [NonSerializedAttribute] [5] ... wenn festgelegt wird, wie JSON serialisiert und deserialisiert werden soll.

Er sagt auch dies:

Hinweis

Json.NET Attribute presidence über Standard .NET Serialisierung Attribute übernehmen, zum Beispiel Wenn sowohl JsonPropertyAttribute als auch DataMemberAttribute für eine Eigenschaft vorhanden sind und beide den Namen anpassen, wird der Name aus JsonPropertyAttribute verwendet.

Es scheint, die Lösung für das Problem [JsonObject(IsReference = false)] zu Ihrem Objekt (e) wie folgt hinzuzufügen ist:

[DataContract(IsReference = true)] 
[JsonObject(IsReference = false)] 
public class MyObject 
{ 
    [DataMember] 
    public int MyProperty { get; set; } 
} 
7

Hier einige Javascript Ich benutze die $ id/$ ref Objekte auf der Clientseite zu handhaben:

// function to return a JSON object form a JSON.NET serialized object with $id/$ref key-values 
// obj: the obj of interest. 
// parentObj: the top level object containing all child objects as serialized by JSON.NET. 
function getJsonNetObject(obj, parentObj) { 
    // check if obj has $id key. 
    var objId = obj["$id"]; 
    if (typeof (objId) !== "undefined" && objId != null) { 
     // $id key exists, so you have the actual object... return it 
     return obj; 
    } 
    // $id did not exist, so check if $ref key exists. 
    objId = obj["$ref"]; 
    if (typeof (objId) !== "undefined" && objId != null) { 
     // $ref exists, we need to get the actual object by searching the parent object for $id 
     return getJsonNetObjectById(parentObj, objId); 
    } 
    // $id and $ref did not exist... return null 
    return null; 
} 

// function to return a JSON object by $id 
// parentObj: the top level object containing all child objects as serialized by JSON.NET. 
// id: the $id value of interest 
function getJsonNetObjectById(parentObj, id) { 
    // check if $id key exists. 
    var objId = parentObj["$id"]; 
    if (typeof (objId) !== "undefined" && objId != null && objId == id) { 
     // $id key exists, and the id matches the id of interest, so you have the object... return it 
     return parentObj; 
    } 
    for (var i in parentObj) { 
     if (typeof (parentObj[i]) == "object" && parentObj[i] != null) { 
      //going one step down in the object tree 
      var result = getJsonNetObjectById(parentObj[i], id); 
      if (result != null) { 
       // return found object 
       return result; 
      } 
     } 
    } 
    return null; 
} 
+0

Danke für eine Antwort, die tatsächlich funktioniert. Ich habe die letzte halbe Stunde damit verbracht, dies in Microsoft WebApi 2.1 zu deaktivieren. – ChrisG

23

dies in der Global.asax Setzen Referenz Handhabung zu konfigurieren. PreserveReferencesHandling sollte nicht 'Alle' sein

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.None; 
+0

Ich habe alle Kombinationen von PreserveReferencesHandling ausprobiert, einschließlich "None". Jede Einstellung (derzeit "None") ergibt dieselbe Ausgabe: $ id/$ ref wird ausgegeben. Etwas, irgendwo muss meine Einstellung übersteuern. – Michael

+0

@Michael könnten Sie diesen Fehler beheben? Können Sie mir bitte zu diesem Thema helfen: http://stackoverflow.com/questions/41244296/net-webapi-how-to-prevent-ref-x-output-of-json – fobus

-2

[JsonIgnore] arbeitete für mich. Innerhalb des Modells enthalten:

[JsonIgnore] 
    public virtual ICollection<cell_order> cell_order { get; set; } 

Leider muss dies für jeden Fall wo erforderlich getan werden.

Verwandte Themen