Изменения документа Newtonsoft. Json

Редактировал(а) Alexandr Fokin 2024/04/20 22:16

От версии 1.10
отредактировано Alexandr Fokin
на 2020/02/23 22:13
Изменить комментарий: Редактировать комментарий
К версии 7.16
отредактировано Alexandr Fokin
на 2022/07/22 04:11
Изменить комментарий: Удаленный объект

Сводка

Подробности

Свойства страницы
Родительский документ
... ... @@ -1,1 +1,1 @@
1 -Разработка.NET.Библиотеки.WebHome
1 +Разработка.NET.Библиотеки.Документы.Сериализация.Json.WebHome
Теги
... ... @@ -1,1 +1,1 @@
1 -json|c#
1 +json|c#|jsonPath
Содержимое
... ... @@ -1,3 +1,17 @@
1 +Иерархия основных сущностей json в библиотеке.
2 +[[image:newtonsoft.json. Иерархия.jpg]]
1 1  
4 +
5 +Библиотека позволяет:
6 +1) Выполнят сериализацию/десереализацию классов
7 +2) Работать со структурой json документа, используя абстракции (JObject, JArray...)
8 +3) Делать запросы к структуре json используя язык JsonPath (SelectToken(query))
9 +
10 +Ссылки:
2 2  https://www.newtonsoft.com/json
3 3  https://www.nuget.org/packages/NewtonSoft.Json
13 +
14 +Querying JSON with complex JSON Path
15 +https://www.newtonsoft.com/json/help/html/QueryJsonSelectTokenJsonPath.htm
16 +JSONPath - XPath for JSON
17 +https://goessner.net/articles/JsonPath/
newtonsoft.json. Иерархия.graphml
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.cccc1808
Размер
... ... @@ -1,0 +1,1 @@
1 +10.0 KB
Содержимое
... ... @@ -1,0 +1,162 @@
1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2 +<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd">
3 + <!--Created by yEd 3.19.1.1-->
4 + <key attr.name="Description" attr.type="string" for="graph" id="d0"/>
5 + <key for="port" id="d1" yfiles.type="portgraphics"/>
6 + <key for="port" id="d2" yfiles.type="portgeometry"/>
7 + <key for="port" id="d3" yfiles.type="portuserdata"/>
8 + <key attr.name="url" attr.type="string" for="node" id="d4"/>
9 + <key attr.name="description" attr.type="string" for="node" id="d5"/>
10 + <key for="node" id="d6" yfiles.type="nodegraphics"/>
11 + <key for="graphml" id="d7" yfiles.type="resources"/>
12 + <key attr.name="url" attr.type="string" for="edge" id="d8"/>
13 + <key attr.name="description" attr.type="string" for="edge" id="d9"/>
14 + <key for="edge" id="d10" yfiles.type="edgegraphics"/>
15 + <graph edgedefault="directed" id="G">
16 + <data key="d0"/>
17 + <node id="n0">
18 + <data key="d5"/>
19 + <data key="d6">
20 + <y:ShapeNode>
21 + <y:Geometry height="30.0" width="79.0" x="337.0" y="132.0"/>
22 + <y:Fill color="#FFCC00" transparent="false"/>
23 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
24 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="14" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.1513671875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="53.013671875" x="12.9931640625" xml:space="preserve" y="4.42431640625">JToken<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
25 + <y:Shape type="ellipse"/>
26 + </y:ShapeNode>
27 + </data>
28 + </node>
29 + <node id="n1">
30 + <data key="d5"/>
31 + <data key="d6">
32 + <y:ShapeNode>
33 + <y:Geometry height="30.0" width="79.0" x="225.0" y="231.0"/>
34 + <y:Fill color="#FFCC00" transparent="false"/>
35 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
36 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="14" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.1513671875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="77.1240234375" x="0.93798828125" xml:space="preserve" y="4.42431640625">JContainer<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
37 + <y:Shape type="ellipse"/>
38 + </y:ShapeNode>
39 + </data>
40 + </node>
41 + <node id="n2">
42 + <data key="d5"/>
43 + <data key="d6">
44 + <y:ShapeNode>
45 + <y:Geometry height="30.0" width="79.0" x="435.0" y="231.0"/>
46 + <y:Fill color="#FFCC00" transparent="false"/>
47 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
48 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="14" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.1513671875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="49.1376953125" x="14.93115234375" xml:space="preserve" y="4.42431640625">JValue<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
49 + <y:Shape type="ellipse"/>
50 + </y:ShapeNode>
51 + </data>
52 + </node>
53 + <node id="n3">
54 + <data key="d5"/>
55 + <data key="d6">
56 + <y:ShapeNode>
57 + <y:Geometry height="30.0" width="79.0" x="228.25" y="310.0"/>
58 + <y:Fill color="#FFCC00" transparent="false"/>
59 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
60 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="14" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.1513671875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="48.365234375" x="15.3173828125" xml:space="preserve" y="4.42431640625">JArray<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
61 + <y:Shape type="ellipse"/>
62 + </y:ShapeNode>
63 + </data>
64 + </node>
65 + <node id="n4">
66 + <data key="d5"/>
67 + <data key="d6">
68 + <y:ShapeNode>
69 + <y:Geometry height="30.0" width="79.0" x="337.0" y="310.0"/>
70 + <y:Fill color="#FFCC00" transparent="false"/>
71 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
72 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="14" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.1513671875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="55.3515625" x="11.82421875" xml:space="preserve" y="4.42431640625">JObject<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
73 + <y:Shape type="ellipse"/>
74 + </y:ShapeNode>
75 + </data>
76 + </node>
77 + <node id="n5">
78 + <data key="d5"/>
79 + <data key="d6">
80 + <y:ShapeNode>
81 + <y:Geometry height="30.0" width="79.0" x="119.5" y="310.0"/>
82 + <y:Fill color="#FFCC00" transparent="false"/>
83 + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/>
84 + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="14" fontStyle="bold" hasBackgroundColor="false" hasLineColor="false" height="21.1513671875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="69.3583984375" x="4.82080078125" xml:space="preserve" y="4.42431640625">JProperty<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel>
85 + <y:Shape type="ellipse"/>
86 + </y:ShapeNode>
87 + </data>
88 + </node>
89 + <edge id="e0" source="n0" target="n1">
90 + <data key="d9"/>
91 + <data key="d10">
92 + <y:PolyLineEdge>
93 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
94 + <y:LineStyle color="#000000" type="line" width="1.0"/>
95 + <y:Arrows source="none" target="standard"/>
96 + <y:BendStyle smoothed="false"/>
97 + </y:PolyLineEdge>
98 + </data>
99 + </edge>
100 + <edge id="e1" source="n0" target="n2">
101 + <data key="d9"/>
102 + <data key="d10">
103 + <y:PolyLineEdge>
104 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
105 + <y:LineStyle color="#000000" type="line" width="1.0"/>
106 + <y:Arrows source="none" target="standard"/>
107 + <y:BendStyle smoothed="false"/>
108 + </y:PolyLineEdge>
109 + </data>
110 + </edge>
111 + <edge id="e2" source="n1" target="n3">
112 + <data key="d9"/>
113 + <data key="d10">
114 + <y:PolyLineEdge>
115 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
116 + <y:LineStyle color="#000000" type="line" width="1.0"/>
117 + <y:Arrows source="none" target="standard"/>
118 + <y:BendStyle smoothed="false"/>
119 + </y:PolyLineEdge>
120 + </data>
121 + </edge>
122 + <edge id="e3" source="n1" target="n4">
123 + <data key="d9"/>
124 + <data key="d10">
125 + <y:PolyLineEdge>
126 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
127 + <y:LineStyle color="#000000" type="line" width="1.0"/>
128 + <y:Arrows source="none" target="standard"/>
129 + <y:BendStyle smoothed="false"/>
130 + </y:PolyLineEdge>
131 + </data>
132 + </edge>
133 + <edge id="e4" source="n1" target="n5">
134 + <data key="d9"/>
135 + <data key="d10">
136 + <y:PolyLineEdge>
137 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/>
138 + <y:LineStyle color="#000000" type="line" width="1.0"/>
139 + <y:Arrows source="none" target="standard"/>
140 + <y:BendStyle smoothed="false"/>
141 + </y:PolyLineEdge>
142 + </data>
143 + </edge>
144 + <edge id="e5" source="n5" target="n0">
145 + <data key="d9"/>
146 + <data key="d10">
147 + <y:PolyLineEdge>
148 + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0">
149 + <y:Point x="159.0" y="147.0"/>
150 + </y:Path>
151 + <y:LineStyle color="#000000" type="line" width="1.0"/>
152 + <y:Arrows source="none" target="standard"/>
153 + <y:BendStyle smoothed="false"/>
154 + </y:PolyLineEdge>
155 + </data>
156 + </edge>
157 + </graph>
158 + <data key="d7">
159 + <y:Resources/>
160 + </data>
161 +</graphml>
162 +
newtonsoft.json. Иерархия.jpg
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.cccc1808
Размер
... ... @@ -1,0 +1,1 @@
1 +36.5 KB
Содержимое
XWiki.XWikiComments[0]
Автор
... ... @@ -1,1 +1,0 @@
1 -XWiki.cccc1808
Комментарий
... ... @@ -1,7 +1,0 @@
1 -Возможна реализация собственной логики сериализации/десериализации для типа T и использование ее на уровне классов сущностей в виде атрибутов над свойством.
2 -(Например для Dictionary)
3 -
4 -Необходимо реализовать интерфейс JsonConverter или JsonConverter<T>
5 -И либо использовать атрибут [JsonConverter(typeof(ConverterImplementation))]
6 -либо задать JsonConverter в свойствах serializer.Converters.Add(new ConverterImplementation())
7 -Если свойства CanRead/CanWrite задать false, то будет использоваться реализация по умолчанию
Дата
... ... @@ -1,1 +1,0 @@
1 -2020-02-13 13:15:26.153
XWiki.XWikiComments[1]
Автор
... ... @@ -1,1 +1,0 @@
1 -XWiki.cccc1808
Комментарий
... ... @@ -1,4 +1,0 @@
1 -Сереализатор не может самостоятельно десереализовать абстрактный тип т.к. не знает какую реализацию стоит использовать. Возможное решение:
2 -1) Поместить исходную json строку в context объекта сериализатора. (Тем самым мы получим возможность обратиться к нему из JsonConverter)
3 -2) Создать реализацию JsonConverter, которая будет извлекать json строку из context и выполнять анализ, на основе которого можно было бы разрешить тип абстрактного класса. (используя либо анализ строки, либо анализ JObject, либо десереализацию части объекта)
4 -3) Навесить данный атрибут над свойством с абстрактным типом класса.
Дата
... ... @@ -1,1 +1,0 @@
1 -2020-02-23 22:12:11.817
XWiki.XWikiComments[4]
Автор
... ... @@ -1,0 +1,1 @@
1 +XWiki.cccc1808
Комментарий
... ... @@ -1,0 +1,4 @@
1 +Сериализация объектов с циклическими ссылками
2 +
3 +ReferenceLoopHandling
4 +https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_ReferenceLoopHandling.htm
Дата
... ... @@ -1,0 +1,1 @@
1 +2021-07-04 17:46:30.663